package com.ybkj.daijia.server.mapper;

import com.ybkj.daijia.server.model.Order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface OrderMapper {

    /**
     *
     *
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectAllFinished(@Param("offset") Integer offset, @Param("size") Integer size);

    /**
     *
     *
     * @return
     */
    Long countAllFinished();

    /**
     * 保存订单信息到数据库
     *
     * @param order
     * @return 保存成功返回Id信息
     */
    Long insertRecord(Order order);

    /**
     *
     *
     * @param id
     * @return
     */
    List<Order> selectByMemberId(@Param("id") Long id);    //根据客户主键查询订单

    /**
     *
     *
     * @param id
     * @return
     */
    List<Order> selectActiveByMemberId(@Param("id") Long id);//根据客户主键查询有效订单

    /**
     * 根据主键查询订单信息
     *
     * @param id
     * @return
     */
    Order selectByPrimaryKey(Long id);

    Order selectByPrimaryKeyForUpdate(Long id);

    /**
     * 根据编码查询订单信息
     *
     * @param orderNumber
     * @return
     */
    Order selectByOrderNumber(String orderNumber);

    /**
     * 统计重复订单
     *
     * @param orderNumber
     * @return
     */
    Integer CountByOrderNumber(String orderNumber);

    /**
     * 根据一组主键查询订单信息
     *
     * @param ids
     * @return
     */
    List<Order> selectByIdIn(Long[] ids);

    /**
     * 根据主键删除订单信息
     *
     * @param id
     * @return 返回影响的行数
     */
    int deleteByPrimaryKey(Long id);

    /**
     *
     *
     * @param companyId
     * @return
     */
    int deleteByCompany(Long companyId);

    /**
     * 分页查询订单信息
     *
     * @param companyId
     * @param param
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectAllByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 统计订单信息
     *
     * @param companyId
     * @param param
     * @return
     */
    long countAllByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param);

    /**
     * 分页查询拒单订单信息
     *
     * @param companyId
     * @param param
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectRefuseByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param,
        @Param("offset") Integer offset, @Param("size") Integer size);


    /**
     * 统计拒单订单信息
     *
     * @param companyId
     * @param param
     * @return
     */
    long countRefuseByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param);

    /**
     * 分页查询销单订单信息
     *
     * @param companyId
     * @param param
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectCancelByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 统计销单订单信息
     *
     * @param companyId
     * @param param
     * @return
     */
    long countCancelByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param);

    /**
     * 分页查询完成订单信息
     *
     * @param companyId
     * @param param
     * @param payType
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectFinishedByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param,
        @Param("payType") String payType, @Param("offset") Integer offset,
        @Param("size") Integer size);


    /**
     * 统计完成订单信息
     *
     * @param companyId
     * @param param
     * @param payType
     * @return
     */
    long countFinishedByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param, @Param("payType") String payType);

    /**
     * 分页查询报单订单信息
     *
     * @param companyId
     * @param param
     * @param payType
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectBaodanByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param,
        @Param("payType") String payType, @Param("offset") Integer offset,
        @Param("size") Integer size);

    /**
     * 统计报单订单信息
     *
     * @param companyId
     * @param param
     * @param payType
     * @return
     */
    long countBaodanByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param, @Param("payType") String payType);

    /**
     * 分页查询异常订单信息
     *
     * @param companyId
     * @param param
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectWarmByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param,
        @Param("date") Date date, @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 统计异常订单信息
     *
     * @param companyId
     * @param param
     * @return
     */
    long countWarmByCompanyWithParams(@Param("companyId") Long companyId,
        @Param("param") String param, @Param("date") Date date);

    /**
     * 查询调度订单
     *
     * @param companyId
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectDiaoduByCompany(@Param("companyId") Long companyId,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 分页查询完成/报单订单
     *
     * @param driverId
     * @param start
     * @param end
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectFinishedByDriverWithDate(@Param("driverId") Long driverId,
        @Param("start") Date start,
        @Param("end") Date end, @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 查询完成/报单订单
     *
     * @param driverId
     * @param start
     * @param end
     * @return
     */
    long countFinishedByDriverWithDate(@Param("driverId") Long driverId, @Param("start") Date start,
        @Param("end") Date end);

    /**
     * 查询完成/报单订单总金额
     *
     * @param driverId
     * @param start
     * @param end
     * @return
     */
    BigDecimal sumMoneyByDriverWithDate(@Param("driverId") Long driverId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司查询完成/报单订单总金额
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    BigDecimal sumMoneyByCompanyWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);


    /**
     * 根据公司、状态、时间查询订单总数
     *
     * @param companyId
     * @param status1
     * @param status2
     * @param start
     * @param end
     * @return
     */
    long countByCompanyWithStatusAndDate(@Param("companyId") Long companyId,
        @Param("status1") Integer status1, @Param("status2") Integer status2,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据司机、状态查询订单信息
     *
     * @param driverId
     * @param status1
     * @param status2
     * @return
     */
    List<Order> selectByDriverWithStatus(@Param("driverId") Long driverId,
        @Param("status1") Integer status1, @Param("status2") Integer status2);

    /**
     * 查询历史订单信息
     *
     * @param clientPhone
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectHistoryOrder(@Param("clientPhone") String clientPhone,
        @Param("companyId") Long companyId,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 查询历史订单总数
     *
     * @param clientPhone
     * @return
     */
    long countHistoryOrder(@Param("clientPhone") String clientPhone,
        @Param("companyId") Long companyId);

    /**
     * 查询今日订单信息
     *
     * @param clientPhone
     * @param start
     * @param end
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectTodayOrder(@Param("clientPhone") String clientPhone,
        @Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 查询今日订单总数
     *
     * @param clientPhone
     * @param start
     * @param end
     * @return
     */
    long countTodayOrder(@Param("clientPhone") String clientPhone,
        @Param("companyId") Long companyId, @Param("start") Date start, @Param("end") Date end);


    /**
     * 根据公司和状态查询订单信息
     *
     * @param companyId
     * @param status1
     * @param status2
     * @return
     */
    List<Order> selectByCompanyWithStatus(@Param("companyId") Long companyId,
        @Param("status1") Integer status1, @Param("status2") Integer status2);

    /**
     * 根据公司和状态查询订单总数
     *
     * @param companyId
     * @param status1
     * @param status2
     * @return
     */
    long countByCompanyWithStatus(@Param("companyId") Long companyId,
        @Param("status1") Integer status1, @Param("status2") Integer status2);


    /**
     * 根据公司和创建时间查询订单信息
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    List<Order> selectByCompanyWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据客户、日期查询忙碌中订单信息
     *
     * @param clientId
     * @param start
     * @param end
     * @return
     */
    List<Order> selectBusyByMemberWithDate(@Param("clientId") Long clientId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据客户、订单状态查询订单信息
     *
     * @param clientId
     * @param status1
     * @param status2
     * @param status3
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectByMemberWithStatus(@Param("clientId") Long clientId,
        @Param("status1") Integer status1, @Param("status2") Integer status2,
        @Param("status3") Integer status3,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 根据客户、订单状态查询订单总数
     *
     * @param clientId
     * @param status1
     * @param status2
     * @param status3
     * @return
     */
    long countByMemberWithStatus(@Param("clientId") Long clientId,
        @Param("status1") Integer status1, @Param("status2") Integer status2,
        @Param("status3") Integer status3);

    /**
     * 根据客户、预约时间查询订单总数
     *
     * @param clientId
     * @param start
     * @param end
     * @return
     */
    long countByMemberWithServerTime(@Param("clientId") Long clientId, @Param("start") Date start,
        @Param("end") Date end);

    /**
     * 查询抢单订单信息
     *
     * @return
     */
    List<Order> selectRushOrders();

    /**
     * 根据客户电话查询订单总数
     *
     * @param clientPhone
     * @param start
     * @param end
     * @return
     */
    long countByMemberPhoneWithDate(@Param("clientPhone") String clientPhone,
        @Param("start") Date start, @Param("end") Date end);

    /**
     *
     *
     * @param clientPhone
     * @param start
     * @param end
     * @return
     */
    long countNotCancelByMemberPhoneWithDate(@Param("clientPhone") String clientPhone,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 老板端派单距离内的忙碌司机
     *
     * @param rightBottomLat
     * @param leftTopLat
     * @param leftTopLng
     * @param rightBottomLng
     * @return
     */
    List<Order> selectBossNearBy(@Param("rightBottomLat") Double rightBottomLat,
        @Param("leftTopLat") Double leftTopLat,
        @Param("leftTopLng") Double leftTopLng, @Param("rightBottomLng") Double rightBottomLng);

    /**
     * 派单查询
     *
     * @param driverId
     * @param start
     * @param end
     * @param lastOrderId
     * @return
     */
    Order selectOneByDiverAndFinish(@Param("driverId") Long driverId, @Param("start") Date start,
        @Param("end") Date end, @Param("lastOrderId") Long lastOrderId);

    /**
     * 派单查询
     *
     * @param driverId
     * @param lastOrderId
     * @return
     */
    Order selectOneByDriverBeforeComplete(@Param("driverId") Long driverId,
        @Param("lastOrderId") Long lastOrderId);

    /**
     * time前最后订单
     *
     * @param time
     * @return
     */
    Order selectOneYestodayOrder(@Param("time") Date time);

    /**
     *
     *
     * @param start
     * @param end
     * @return
     */
    List<Order> selectMonthOrder(@Param("start") Date start, @Param("end") Date end);

    /**
     * 派单查询总数
     *
     * @param driverId
     * @param status
     * @param lastOrderId
     * @return
     */
    long countByDriverAndStatus(@Param("driverId") Long driverId, @Param("status") Integer status,
        @Param("lastOrderId") Long lastOrderId);

    /**
     * 根据公司查询查询拒单工单总数
     *
     * @param companyId
     * @return
     */
    long countRefusedByCompany(@Param("companyId") Long companyId);

    /**
     * 根据公司、完成时间查询完成订单的订单类型
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    List<Order> selectFinishedByCompanyWithFinishTimeGroupOrderType(
        @Param("companyId") Long companyId, @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、订单类型查询完成订单数量
     *
     * @param companyId
     * @param orderType
     * @param end
     * @param start
     * @return
     */
    long countFinishedByCompanyWithOrderType(@Param("companyId") Long companyId,
        @Param("orderType") String orderType, @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、订单类型查询完成订单金额
     *
     * @param companyId
     * @param orderType
     * @return
     */
    BigDecimal sumMoneyByCompanyWithOrderType(@Param("companyId") Long companyId,
        @Param("orderType") String orderType, @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、完成时间查询完成订单的客户类型
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    List<Order> selectFinishedByCompanyWithFinishTimeGroupMemberType(
        @Param("companyId") Long companyId, @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、客户类型查询完成订单数量
     *
     * @param companyId
     * @param memberType
     * @return
     */
    long countFinishedByCompanyWithMemberType(@Param("companyId") Long companyId,
        @Param("memberType") String memberType, @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、客户类型查询完成订单金额
     *
     * @param companyId
     * @param memberType
     * @return
     */
    BigDecimal sumMoneyByCompanyWithMemberType(@Param("companyId") Long companyId,
        @Param("memberType") String memberType, @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、完成时间查询完成订单的订单来源
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    List<Order> selectFinishedByCompanyWithFinishTimeGroupFromSource(
        @Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end, @Param("offset") Integer offset,
        @Param("size") Integer size);

    /**
     * 根据公司、订单来源查询完成订单数量
     *
     * @param companyId
     * @param fromSource
     * @return
     */
    long countFinishedByCompanyWithFinishTimeAndFromSource(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end, @Param("fromSource") String fromSource);

    /**
     * 根据公司、订单来源查询完成订单金额
     *
     * @param companyId
     * @param fromSource
     * @return
     */
    BigDecimal sumMoneyByCompanyWithFinishTimeAndFromSource(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end, @Param("fromSource") String fromSource);


    /**
     * 根据客户、完成时间查询完成订单数量
     *
     * @param clientId
     * @param start
     * @param end
     * @return
     */
    long countFinishedByMemberWithFinishTime(@Param("clientId") Long clientId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据客户、完成时间查询完成订单金额
     *
     * @param clientId
     * @param start
     * @param end
     * @return
     */
    BigDecimal sumMoneyByMemberWithFinishTime(@Param("clientId") Long clientId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据公司、日期查询异常订单数量
     *
     * @param companyId
     * @param date
     * @return
     */
    long countWarmByCompanyWithDate(@Param("companyId") Long companyId, @Param("date") Date date);

    /**
     * 根据公司、日期查询完成订单数量
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    long countFinishedByCompanyWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     *
     *
     * @param passengerId
     * @param orderFromSources
     * @param start
     * @param end
     * @return
     */
    long countFinishedByPassengerWithDate(@Param("passengerId") Long passengerId,
        @Param("orderFromSources") String[] orderFromSources,
        @Param("start") Date start, @Param("end") Date end);

    /**
     *
     *
     * @param companyId
     * @param start
     * @param end
     * @return
     */
    long countAllByCompanyWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 根据主键修改数据
     *
     * @param order
     * @return
     */
    int updateByPrimaryKey(Order order);

    /**
     * 获取订单数量
     *
     * @return
     */
    long getRunningNumber();

    /**综合统计 */

    /**
     * 查询本公司单并且是本公司司机完成单量
     *
     * @return
     */
    Long countFinishedByThisCompanyThisDriverWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 查询本公司单并且是本公司司机执行中单量（包括预派单）
     *
     * @return
     */
    Long countBusyByThisCompanyThisDriverWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 查询本公司单并且是其他公司司机完成单量
     *
     * @return
     */
    Long countFinishedByThisCompanyOtherDriverWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);


    /**
     * 查询本公司单并且是其他公司司机执行中单量（包括预派单）
     *
     * @return
     */
    Long countBusyByThisCompanyOtherDriverWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 查询其他公司单并且是本公司司机完成单量
     *
     * @return
     */
    Long countFinishedByOtherCompanyThisDriverWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 查询其他公司单并且是本公司司机执行中单量（包括预派单）
     *
     * @return
     */
    Long countBusyByOtherCompanyThisDriverWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);

    /**
     * 查询销单量
     *
     * @return
     */
    Long countCanceledByCompanyWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);


    /**
     * 综合统计
     */
    Long countActivedOrdersByDriver(@Param("driverId") Long driverId);

    /**
     * 统计驾驶员完成订单数量
     */
    Long countCompletedOrdersByDriver(@Param("driverId") Long driverId);


    /**
     *  3.1.0
     *
     * @param clientId
     * @param companyId
     * @param orderNumber
     * @param clientPhone
     * @param driverPhone
     * @param companyName
     * @param likeCreateOrderName
     * @param orderType
     * @param status
     * @param warm
     * @param warmDate
     * @param start
     * @param end
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectDaijiaList(@Param("clientId") Long clientId,
        @Param("companyId") Long companyId,
        @Param("orderNumber") String orderNumber, @Param("clientPhone") String clientPhone,
        @Param("driverPhone") String driverPhone,
        @Param("companyName") String companyName,
        @Param("createOrderName") String likeCreateOrderName,
        @Param("orderType") String[] orderType, @Param("status") List<Integer> status,
        @Param("notpay") Boolean notpay,
        @Param("warm") boolean warm, @Param("warmDate") Date warmDate, @Param("start") Date start,
        @Param("end") Date end,
        @Param("startFinish") Date startFinish, @Param("endFinish") Date endFinish,
        @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     *
     *
     * @param clientId
     * @param companyId
     * @param orderNumber
     * @param clientPhone
     * @param driverPhone
     * @param companyName
     * @param likeCreateOrderName
     * @param orderType
     * @param status
     * @param warm
     * @param warmDate
     * @param start
     * @param end
     * @return
     */
    Long countDaijiaList(@Param("clientId") Long clientId, @Param("companyId") Long companyId,
        @Param("orderNumber") String orderNumber, @Param("clientPhone") String clientPhone,
        @Param("driverPhone") String driverPhone,
        @Param("companyName") String companyName,
        @Param("createOrderName") String likeCreateOrderName,
        @Param("orderType") String[] orderType, @Param("status") List<Integer> status,
        @Param("notpay") Boolean notpay,
        @Param("warm") boolean warm, @Param("warmDate") Date warmDate, @Param("start") Date start,
        @Param("end") Date end,
        @Param("startFinish") Date startFinish, @Param("endFinish") Date endFinish);

    /**
     *
     *
     * @param driverId
     * @return
     */
    List<Order> selectActivedOrdersByDriver(@Param("driverId") Long driverId);

    /**
     *
     *
     * @param clientId
     * @param offset
     * @param size
     * @return
     */
    List<Order> selectByParam(@Param("clientId") Long clientId, @Param("offset") Integer offset,
        @Param("size") Integer size);

    /**
     *
     *
     * @param clientId
     * @return
     */
    Long countByParam(@Param("clientId") Long clientId);

    /**
     * 关闭催单提示框
     *
     * @param orderId
     * @return
     */
    int closeCuidan(@Param("orderId") Long orderId);

    /**
     * 更新上次催单时间
     *
     * @param orderId
     * @return
     */
    int updateCuidan(@Param("orderId") Long orderId);

    /**
     * 查询催单记录
     *
     * @return
     */
    List<Order> selectCuidan();

    /**
     * 根据客户id查询最近的完成订单
     *
     * @return
     */
    Order selectLastedOneFinishedByPassenger(@Param("passengerId") Long passengerId);

    /**
     *
     *
     * @param orderGroupId
     * @return
     */
    List<Order> selectByGroup(@Param("orderGroupId") Long orderGroupId);

    /**
     * 根据公司id查询过路费
     *
     * @return
     */
    BigDecimal sumAllGuoluMoneyByCompanyWithDate(@Param("companyId") Long companyId,
        @Param("start") Date start, @Param("end") Date end);


    long countNotPayByPassenger(@Param("passengerId") Long passengerId);

    long countNotFinishedByPassenger(@Param("passengerId") Long passengerId);

    long countTodayOrderByPassenger(@Param("passengerId") Long passengerId);

    List<Order> findReward(@Param("driverId") Long driverId,
        @Param("lowestMoney") BigDecimal lowestMoney, @Param("start") Date start,
        @Param("end") Date end);

    void baoxiao(@Param("id") Long id, @Param("money") BigDecimal money);

    int addFinishTime(Long id);

    List<Order> selectByManager(@Param("managerId") Long managerId, @Param("offset") Integer offset,
        @Param("size") Integer size);

    long countByManager(Long managerId);

}
